﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.UI.Bovespa.Clientes.View.SmartClient;
using Sinacor.UI.Bovespa.Ordens.View.SmartClient;
using Sinacor.Infra.UI.Common;
using System.Collections;

namespace Sinacor.UI.Bovespa.ManutencaoOrdens.View.SmartClient
{
    public partial class CasamentoManual : SinacorWindow, ICasamentoManual
    {
        #region Campos
        public string _style = string.Empty;
        private bool _ordemSelecionada = false;
        private bool _proibirAcesso = false;

        public Model.Ordem CurrentModel
        {
            get
            {
                return (Model.Ordem)this.dtgOrdem.SelectedItem;
            }
        }
        #endregion

        #region Presenter
        /// <summary>
        /// Casamento Manual
        /// </summary>
        public Presenter.CasamentoManual _presenter { get; set; }
        #endregion

        #region Construtor
        /// <summary>
        /// CadastroApelidoCliente
        /// </summary>
        public CasamentoManual()
        {
            InitializeComponent();

            this._presenter = new Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter.CasamentoManual(this);
            this.DataContext = this._presenter;

            this.dtgOrdem.NewItemType = typeof(Model.Ordem);
            //this.dtgNegociosDisp.NewItemType = typeof(Model.Negocio);
            //this.dtgNegociosExec.NewItemType = typeof(Model.Negocio);
            this.AfterInitialize += new RoutedEventHandler(CasamentoManual_AfterInitialize);
        }

        private void CasamentoManual_AfterInitialize(object sender, RoutedEventArgs e)
        {
            base.ShowUserWaitingProcess();

            this._presenter.Inicializar();

            base.HideUserWaitingProcess();
        }


        #endregion

        #region ICasamentoManual Members

        /// <summary>
        /// Armazenar na variável de estilo a referência a cor GridRowBusiness06
        /// </summary>    
        public void ApresentarNegocioNaoCasado()
        {
            _style = BaseRow.GridRowBusiness06;
        }

        /// <summary>
        /// Armazenar na variável de estilo a referência a cor GridRowBusiness04
        /// </summary>
        public void ApresentarNegocioParcialmenteCasado()
        {
            _style = BaseRow.GridRowBusiness04;
        }

        /// <summary>
        /// Armazenar na variável de estilo a referência a cor GridRowBusiness02
        /// </summary>
        public void ApresentarOrdemCasada()
        {
            _style = BaseRow.GridRowBusiness02;
        }

        /// <summary>
        /// Armazenar na variável de estilo a referência a cor GridRowBusiness06
        /// </summary>
        public void ApresentarOrdemNaoCasada()
        {
            _style = BaseRow.GridRowBusiness06;
        }

        /// <summary>
        /// Armazenar na variável de estilo a referência a cor GridRowBusiness04
        /// </summary>
        public void ApresentarOrdemParcialmenteCasada()
        {
            _style = BaseRow.GridRowBusiness04;
        }

        /// <summary>
        /// Atualiza combobox de calendário
        /// </summary>
        public void AtualizarCalendario()
        {
            this.cmbDataMovimento.ItemsSource = _presenter.Calendario;
            this.cmbDataMovimento.UpdateTarget(SinacorComboBox.SelectedValueProperty);
        }

        /// <summary>
        /// Realizar um update target na data grid de negócios disponíveis
        /// </summary>
        public void AtualizarNegociosDisponiveis()
        {
            this.dtgNegociosDisp.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        /// <summary>
        /// Realizar um update target na data grid de negócios executados
        /// </summary>
        public void AtualizarNegociosExecutados()
        {
            this.dtgNegociosExec.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        /// <summary>
        /// AtualizarOrdens
        /// </summary>
        public void AtualizarOrdens()
        {
            this.dtgOrdem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }


        /// <summary>
        /// Atribuir ao item selecionado na grid a nova cor da linha
        /// </summary>
        public void AtualizarOrdemSelecionada()
        {
            this.dtgOrdem.GetRow(_presenter.OrdemAtual).ApplyStyle();
        }

        /// <summary>
        /// Apresentar a mensagem da resource key Bovespa.Ordens.Message.CasamentoOrdemXNegocio, com as opções Sim e Não
        /// </summary>
        /// <returns></returns>
        public bool ConfirmaCasamento()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.CasamentoOrdemXNegocio").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Apresentar a mensagem da resource key Bovespa.Ordens.Message.DescasamentoExecução, com as opções Sim e Não
        /// </summary>
        /// <returns></returns>
        public bool ConfirmaDescasamento()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(TryFindResource("Bovespa.Ordens.Message.DescasamentoExecucao").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Apresentar a mensagem da resource key Bovespa.ManutencaoOrdens.ExceptionMessage.CasamentoMovimentoAberto
        /// </summary>
        public void InformarMovimentoFechado()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.ManutencaoOrdens.ExceptionMessage.CasamentoMovimentoAberto").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        /// <summary>
        /// Apresentar a mensagem da resource key Bovespa.ManutencaoOrdens.Message.OperacaoSucesso
        /// </summary>
        public void InformarSucesso()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.ManutencaoOrdens.Message.OperacaoSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        /// <summary>
        /// Desabilitar as opções de casamento e descasamento dos menus contextuais de todas as datagrid´s da tela
        /// </summary>
        public void ProibirAcesso()
        {
            this._proibirAcesso = true;
        }

        /// <summary>
        /// Manter selecionado no combobox de calendário do pregão a data do movimento 
        /// </summary>
        public void SelecionarDataMovimento()
        {
            if (cmbDataMovimento.Items.Count > 0 && this._presenter.InformacoesMovimento.DataMovimento > DateTime.MinValue)
            {
                cmbDataMovimento.SelectedValue = _presenter.InformacoesMovimento.DataMovimento.ToShortDateString();
            }
        }

        /// <summary>
        /// Apresentar a mensagem da resource key Bovespa.ManutencaoOrdens.Message.PesquisaSemRetorno
        /// </summary>
        public void InformarNenhumRegistroEncontrado()
        {
            this.ShowError("Bovespa.ManutencaoOrdens.Message.PesquisaSemRetorno");
        }



        #endregion

        #region Métodos

        private void Pesquisar()
        {
            this.ClearServiceErrors();

            base.ShowUserWaitingProcess();

            if (rbCompraVenda.IsChecked == true)
            {
                _presenter.Filtro.NaturezaOperacao = Model.Enum.NaturezaOperacao.CompraVenda;
            }
            else if (rbCompra.IsChecked == true)
            {
                _presenter.Filtro.NaturezaOperacao = Model.Enum.NaturezaOperacao.Compra;
            }
            else if (rbVenda.IsChecked == true)
            {
                _presenter.Filtro.NaturezaOperacao = Model.Enum.NaturezaOperacao.Venda;
            }


            if (rbCasadas.IsChecked == true)
            {
                _presenter.Filtro.Casadas = true;
            }
            else
            {
                _presenter.Filtro.Casadas = false;
            }

            if (rbCasadasParcial.IsChecked == true)
            {
                _presenter.Filtro.CasadasParcialmente = true;
            }
            else
            {
                _presenter.Filtro.CasadasParcialmente = false;
            }


            if (rbNaoCasadas.IsChecked == true)
            {
                _presenter.Filtro.NaoCasadas = true;
            }
            else
            {
                _presenter.Filtro.NaoCasadas = false;
            }

            txtApelidoFiltro.Validate();
            txtAtivoFiltro.Validate();

            if (!this.HasErrors)
            {
                this._presenter.ConsultarOrdens();
            }

            base.HideUserWaitingProcess();

        }

        private void LimparCasadosEDisponiveis()
        {
            this._presenter.NegociosDisponiveis = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();
            this._presenter.NegociosExecutados = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();
            this.AtualizarNegociosDisponiveis();
            this.AtualizarNegociosExecutados();
        }

        private void LimparPesquisa()
        {
            this.txtApelidoFiltro.IsRequired = false;
            this.txtAtivoFiltro.IsRequired = false;

            ClearServiceErrors();

            this._presenter.Inicializar();
            //this.SelecionarDataMovimento();

            this._presenter.Filtro.ApelidoCliente = null;
            this._presenter.Filtro.Ativo = null;
            //this._presenter.Filtro
            this._presenter.ListaOrdens.Clear();
            this._presenter.NegociosDisponiveis.Clear(); 
            this._presenter.NegociosExecutados.Clear(); 
            txtApelidoFiltro.UpdateTarget(SinacorTextBox.TextProperty);
            txtAtivoFiltro.UpdateTarget(SinacorTextBox.TextProperty);
            rbCompraVenda.IsChecked = true;
            this.SelecionarDataMovimento();
            rbTodas.IsChecked = true;
            //this._proibirAcesso = false;
            this._ordemSelecionada = false;

            this.txtApelidoFiltro.IsRequired = true;
            this.txtAtivoFiltro.IsRequired = true;


        }

        /// <summary>
        /// Descasar negócios
        /// </summary>
        /// <param name="negociosDisp"></param>
        private void DescasarNegocios(IList negociosDisp)
        {
            ModelCollection<Model.Negocio> negocio = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();
            
            if (negociosDisp != null && negociosDisp.Count > 0)
            {
                foreach (Model.Negocio item in negociosDisp)
                {
                    negocio.Add(item);

                    negocio[negocio.Count - 1].Ordem = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.ChaveOrdem()
                    {
                        DataOrdem = CurrentModel.DataOrdem,
                        NumeroOrdem = CurrentModel.NumeroOrdem.Value,
                        NumeroOrdemSubSequencia = CurrentModel.NumeroOrdemSubSequencia.Value

                    };

                }
                this.ClearServiceErrors();
                this._presenter.DescasarNegocios(negocio);
            }
        }

        /// <summary>
        /// Casar negócios
        /// </summary>
        /// <param name="negociosExec"></param>
        private void CasarNegocios(IList negociosExec)
        {
            ModelCollection<Model.Negocio> negocio = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();
            
            if (negociosExec != null && negociosExec.Count > 0)
            {
                foreach (Model.Negocio item in this.dtgNegociosDisp.SelectedItems)
                {

                    negocio.Add(item);

                    negocio[negocio.Count - 1].Ordem = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.ChaveOrdem()
                    {
                        DataOrdem = CurrentModel.DataOrdem,
                        NumeroOrdem = CurrentModel.NumeroOrdem.Value,
                        NumeroOrdemSubSequencia = CurrentModel.NumeroOrdemSubSequencia.Value

                    };

                }

                this.ClearServiceErrors();
                this._presenter.CasarNegocios(negocio);
            }
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento Drop para descasar ordem
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgNegociosDisp_Drop(object sender, DragEventArgs e)
        {
            this.ShowUserWaitingProcess();

            ItemsControl controleOrigem = e.Data.GetData(typeof(IItemsControlDragSource)) as ItemsControl;

            if (controleOrigem != dtgNegociosDisp)
            {
                IList negociosDisp = e.Data.GetData(typeof(IEnumerable)) as IList;
                this.DescasarNegocios(negociosDisp);
            }

            this.HideUserWaitingProcess();
        }

        /// <summary>
        /// Evento Drop para casar ordem
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgNegociosExec_Drop(object sender, DragEventArgs e)
        {
            this.ShowUserWaitingProcess();

            ItemsControl controleOrigem = e.Data.GetData(typeof(IItemsControlDragSource)) as ItemsControl;

            if (controleOrigem != dtgNegociosExec)
            {
                IList negociosExec = e.Data.GetData(typeof(IEnumerable)) as IList;
                this.CasarNegocios(negociosExec);
            }

            this.HideUserWaitingProcess();
        }

        private void btnPesquisaCliente_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            //Executa a pesquisa do cliente no Cadastro de Clientes, 
            //trazendo da seleção efetuada, 
            //o Apelido do Cliente para o campo Pesquisa::ApelidoCliente;

            PesquisaClientes pesquisaClientes = new PesquisaClientes();

            Clientes.Model.PesquisaCliente filtroPesq = new Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente() { Apelido = txtApelidoFiltro.Text };

            pesquisaClientes.CarregaParametros(Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.CasamentoManual, filtroPesq);

            pesquisaClientes.Owner = this;
            pesquisaClientes.SetMenuHeader("Bovespa.Ordens.Label.CasamentoManual");
            pesquisaClientes.ShowDialog();

            if (pesquisaClientes.PesquisaClienteModel.Codigo > 0)
            {
                this._presenter.Filtro.ApelidoCliente = pesquisaClientes.PesquisaClienteModel.Apelido;
                this._presenter.Filtro.Cliente = pesquisaClientes.PesquisaClienteModel.Codigo;
                txtApelidoFiltro.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void btnPesquisaAtivo_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            //Executar a chamada para a Tela do Cadastro de Ativos;
            //Retornar o Ativo selecionado ao campo Pesquisa::Ativo;

            Ordens.Model.Titulo modelTitulo = new Ordens.Model.Titulo();
            modelTitulo.Codigo = txtAtivoFiltro.Text;
            modelTitulo.Mercado = null;
            modelTitulo.DataPregao = ((Model.Calendario)cmbDataMovimento.SelectedItem).DataPregao;

            PesquisaTitulo pesquisaTitulo = new PesquisaTitulo();
            pesquisaTitulo.CarregarParametros(modelTitulo, null);
            pesquisaTitulo.Owner = this;
            pesquisaTitulo.SetMenuHeader("Bovespa.Ordens.Label.CasamentoManual");
            pesquisaTitulo.ShowDialog();

            if (pesquisaTitulo.TituloEscolhido != null)
            {
                this._presenter.Filtro.Ativo = pesquisaTitulo.TituloEscolhido.Codigo;
                txtAtivoFiltro.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void btnPesquisar_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.Pesquisar();
        }

        private void btnNovaPesquisa_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.LimparPesquisa();
        }

        private void menuEfetuarDescasamentoOrdem_Click(object sender, RoutedEventArgs e)
        {
            base.ShowUserWaitingProcess();
            this.DescasarNegocios(this.dtgNegociosExec.SelectedItems);
            base.HideUserWaitingProcess();
        }

        private void menuEfetuarCasamentoOrdem_Click(object sender, RoutedEventArgs e)
        {
            base.ShowUserWaitingProcess();
            this.CasarNegocios(this.dtgNegociosDisp.SelectedItems);
            base.HideUserWaitingProcess();

        }

        private void dtgOrdem_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {

            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;
                if (e.OriginalSource is BaseRow)
                {
                    this._presenter.VerificarEstadoOrdem(((Model.Ordem)e.ItemInfo.Item));
                }
                e.Style = _style;
            }
        }

        private void dtgNegociosDisp_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;
                if (e.OriginalSource is BaseRow)
                {
                    this._presenter.VerificarEstadoNegocio(((Model.Negocio)e.ItemInfo.Item));
                }
                e.Style = _style;
            }
        }

        private void dtgNegociosExec_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                if (e.OriginalSource is BaseRow)
                {
                    e.Style = BaseRow.GridRowBusiness02;
                }
            }
        }

        private void menuEfetuarCasamentoDisp_Loaded(object sender, RoutedEventArgs e)
        {
            SinacorContextMenuItem menu = (SinacorContextMenuItem)sender;
            menu.IsEnabled = (this.dtgNegociosDisp.SelectedItems.Count > 0 && !_proibirAcesso);
        }

        private void menuEfetuarDescasamentoExec_Loaded(object sender, RoutedEventArgs e)
        {
            SinacorContextMenuItem menu = (SinacorContextMenuItem)sender;
            menu.IsEnabled = (_ordemSelecionada && (this.dtgNegociosExec.SelectedItems.Count > 0) && !_proibirAcesso);
        }

        private void menuPesquisar_Click(object sender, RoutedEventArgs e)
        {
            this.Pesquisar();
        }

        private void dtgOrdem_BufferedSelectionChanged(object sender, BufferedEventArgs<SelectionChangedEventArgs> e)
        {

            this.ClearServiceErrors();
            base.ShowUserWaitingProcess();
            this._ordemSelecionada = (dtgOrdem.SelectedItems.Count > 0);

            this._presenter.OrdemAtual = (Model.Ordem)dtgOrdem.SelectedItem;

            this.LimparCasadosEDisponiveis();

            if (dtgOrdem.SelectedItems.Count == 1)
            {
                if (CurrentModel.QuantidadeExecutada.Value == CurrentModel.Quantidade.Value)
                {
                    this._presenter.ConsultarNegociosExecutados(this._presenter.OrdemAtual);
                }
                else if (CurrentModel.QuantidadeExecutada.Value == 0)
                {
                    this._presenter.ConsultarNegociosDisponiveis(this._presenter.OrdemAtual);
                }
                else
                {
                    this._presenter.ConsultarNegociosExecutados(this._presenter.OrdemAtual);
                    this._presenter.ConsultarNegociosDisponiveis(this._presenter.OrdemAtual);
                }
            }
            base.HideUserWaitingProcess();
        }

        #endregion
    }
}
